/**
**************************************************************************************
*Palisma - Secrets of the Illuminati is an open-source 2D RPG                        *
*Copyright (C) 2006, Tony Sparks                                                     *
*                                                                                    *
*This library is free software; you can redistribute it and/or                       *
*modify it under the terms of the GNU Lesser General Public                          *
*License as published by the Free Software Foundation; either                        *
*version 2.1 of the License, or (at your option) any later version.                  *
*                                                                                    *
*This library is distributed in the hope that it will be useful,                     *
*but WITHOUT ANY WARRANTY; without even the implied warranty of                      *
*MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                   *
*Lesser General Public License for more details.                                     *
*                                                                                    *
*You should have received a copy of the GNU Lesser General Public                    *
*License along with this library; if not, write to the Free Software                 *
*Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA      *
**************************************************************************************
*/
#pragma once


#include <string>

class SoundSource;
class IEntity;

// Common states
enum {
    WALKING,            // 0
    ATTACKING1,         // 1
    ATTACKING2,         // 2
    ATTACKING3,         // 3
    IDLE,               // 4
    RUNNING,            // 5
    GRABBING,           // 6
    THROWING,           // 7
    THROWN,             // 8
    DYING,              // 9
    HIT,                // 10
    DEAD,               // 11
    TALKING,            // 12
    CARRYING,           // 13
    CARRIED,            // 14
    CARRYING_WALKING,   // 15

    /*-------------------------------
        Weapon States
    --------------------------------*/
    WP_READY,           // 16
    WP_FIRING,          // 17
    WP_RELOADING,       // 18

    DEFAULT             // ~
};

// States
const std::string ENT_STATES[] = {  "WALKING",              // 0
                                    "ATTACKING1",           // 1
                                    "ATTACKING2",           // 2
                                    "ATTACKING3",           // 3
                                    "IDLE",                 // 4
                                    "RUNNING",              // 5
                                    "GRABBING",             // 6
                                    "THROWING",             // 7
                                    "THROWN",               // 8
                                    "DYING",                // 9
                                    "HIT",                  // 10
                                    "DEAD",                 // 11
                                    "TALKING",              // 12
                                    "CARRYING",             // 13
                                    "CARRIED" ,             // 14
                                    "CARRYING_WALKING",     // 15
                                    /*-------------------------------
                                        Weapon States
                                    --------------------------------*/
                                    "WP_READY",             // 16
                                    "WP_FIRING",            // 17
                                    "WP_RELOADING",         // 18
                                    ""                      // ~
                               };

// common directions
enum {
	NORTH = 0,  
	EAST  = 1,  
	SOUTH = 2,  
	WEST  = 3  
};

/**
=============
State in which an entity can be in
=============
*/
class State
{
public:
    State():m_sound(NULL), m_scriptFile(""), m_nextUpdate(0.0f) {};

    /** Enter the state */
    virtual void Enter(IEntity* p);
    /** Execute this state - Happens once a frame */
    virtual void Exec(IEntity* p){};
    /** Leave the state */
    virtual void Exit(IEntity* p){};

    /** Get the state name */
    virtual std::string GetStateType() { return ENT_STATES[DEFAULT]; };

    virtual ~State(){};

    // sound to play on enter
    SoundSource*    m_sound;
    // script to run on enter
    std::string     m_scriptFile;

    // duration of the state
    float           m_nextUpdate;

};

